package main

import (
	"fmt"
)

const (
	MAXSIZE = 20
	OK      = 1
	ERROR   = 0
)

type ElemType int

type SqList struct {
	data   [MAXSIZE]ElemType
	length int // 线性表当前长度
}

type Status int

// 时间复杂度O(1)
func GetElem(L SqList, i int) Status { // 顺序线性表 1<=i<ListLength(L),用e返回L中第i个数据元素的值
	if L.length == 0 || i < 1 || i > L.length {
		return ERROR
	}
	return OK
}

// 初始条件：顺序线性表L已存在，1<=i<=ListLength(L)
// 操作结果：在L中第i个位置之前插入新的元素e，L的长度加1
// 时间复杂度O(n)
func InsertList(L *SqList, i int, e ElemType) Status {
	var k int
	if L.length == MAXSIZE { // 顺序线性表已满
		return ERROR
	}
	if i < 1 || i > L.length+1 {
		return ERROR
	}
	if i <= L.length {
		for k = L.length - 1; k >= i; k-- {
			L.data[k+1] = L.data[k]
		}
	}
	L.data[i-1] = e
	L.length++
	return OK
}

// 1，2，3，4，5...
// 1，2，3，4，...
// 2，3，4，5...
// 删除元素:时间复杂度最后一个元素O(1);第一个元素O(n);平均时间复杂度O(n-1/2)=>O(n)
// 如果删除位置不合理，抛出异常
// 取出删除元素
// 从删除元素位置开始遍历到最后一个元素位置，分别将它们都向前移动一个位置
// 表长减1
// 初始条件：顺序线性表L已存在，1<=i<=ListLength(L)
// 操作结果：删除L的第i个数据元素，并用e返回其值，L的长度减1
func DeleteList(L *SqList, i int, e *ElemType) Status {
	var k int
	if L.length == 0 { // 线性表为空
		return ERROR
	}
	if i < 1 || i > L.length { // 删除位置不正确
		return ERROR
	}
	*e = L.data[i-1]
	if i < L.length { // 如果删除位置不是最后位置
		for k = i; k < L.length; k++ {
			L.data[k-1] = L.data[k] // 后面元素全部向前移1位
		}
		L.length--
	}
	return OK
}

func main() {
	fmt.Println("maxsize = ", MAXSIZE)
	sq := SqList{}
	stat := GetElem(sq, 2)
	fmt.Println("stat = ", stat)
}
